﻿package net.wangit;

import net.wangit.context.ActionContext;
import net.wangit.context.ActionContextImpl;
import net.wangit.framework.action.OutActionResult;
import net.wangit.framework.util.ResponseWriter;
import net.wangit.util.Checker;
import net.wangit.util.StringUtil;
import net.wangit.view.unit.UnitFactory;

/**
 * 动态控制客户端内容，可在Action类中创建Ajax对象。
 * 
 * @author watson Feb 24, 2010
 */
public class Ajax {

	private static final String DOMAIN = "ajaxd";
	private static final String UNIT = "ajaxu";
	private ActionContextImpl ac;
	private StringBuffer html;
	private StringBuffer script;

	private void init() throws Exception {
		String domain = ac.getRequestParameter(Ajax.DOMAIN);
		String unitId = ac.getRequestParameter(Ajax.UNIT);
		if (!Checker.isEmpty(domain) && !Checker.isEmpty(unitId))
			addHtml(UnitFactory.getUnit(ac, domain, unitId, null).write(ac));
		String command = ac.getActionParameter();
		if (!Checker.isEmpty(command)) {
			String parameters[] = StringUtil.split(command, ";");
			for (int i = 0; i < parameters.length; i++) {
				String parameter[] = StringUtil.split(parameters[i], ",");
				if (parameter.length > 2) {
					String id = parameter[0].trim();
					domain = parameter[1].trim();
					unitId = parameter[2].trim();
					replace(id, domain, unitId);
				}
			}

		}
	}

	private String formatHtml(String html) {
		html = html.replaceAll("\r\n", "");
		html = html.replaceAll("\r", "");
		html = html.replaceAll("\n", "");
		return StringUtil.replace(html, "'", "'");
	}

	public Ajax(ActionContext ac) throws Exception {
		html = new StringBuffer();
		script = new StringBuffer("<script language=\"JavaScript\">");
		this.ac = (ActionContextImpl) ac;
		this.ac.setActionResult(new OutActionResult());
		init();
	}

	// 追加HTML代码
	public void addHtml(String html) {
		if (!Checker.isEmpty(html))
			this.html.append(html);
	}

	// 追加JavaScript代码
	public void addScript(String script) {
		if (!Checker.isEmpty(script))
			this.script.append(script).append(";");
	}

	// 设置指定id对象的HTML代码
	public void replace(String id, String html) {
		if (!Checker.isEmpty(id) && html != null)
			script.append("$('").append(id).append("').innerHTML='").append(
					formatHtml(html)).append("';");
	}

	// 设置指定id对象的HTML代码为指定单元，可通过Action的url指定单元显示模式
	public void replace(String id, String domain, String unitId)
			throws Exception {
		replace(id, UnitFactory.getUnit(ac, domain, unitId, null).write(ac));
	}

	// 动作设置结束后务必调用此方法。
	public void send() {
		script.append("</script>");
		html.append(script);
		ResponseWriter.write(html.toString());
	}

	// 设置指定id对象的某属性值
	public void setAttributeById(String id, String attribute, String value) {
		if (!Checker.isEmpty(id) && !Checker.isEmpty(attribute)
				&& value != null)
			script.append("$('").append(id).append("').set('")
					.append(attribute).append("','").append(formatHtml(value))
					.append("');");
	}

	// 设置指定name对象的某属性值
	public void setAttributeByName(int index, String name, String attribute,
			String value) {
		if (index >= 0 && !Checker.isEmpty(name) && !Checker.isEmpty(attribute)
				&& value != null)
			script.append("$$('[name=").append(name).append("]')[").append(
					index).append("].set('").append(attribute).append("','")
					.append(formatHtml(value)).append("');");
	}

	// 设置指定id对象是否显示
	public void setHiddenById(String id, boolean hidden) {
		if (!Checker.isEmpty(id))
			script.append("$('").append(id).append("').style.display='")
					.append(hidden ? "none" : "block").append("';");
	}

	// 设置指定name对象是否显示
	public void setHiddenByName(int index, String name, boolean hidden) {
		if (index >= 0 && !Checker.isEmpty(name))
			script.append("$$('[name=").append(name).append("]')[").append(
					index).append("].style.display='").append(
					hidden ? "none" : "block").append("';");
	}

	// 设置指定name对象的值
	public void setValueByName(int index, String name, double value) {
		setValueByName(index, name, Double.toString(value));
	}

	// 设置指定name对象的值
	public void setValueByName(int index, String name, float value) {
		setValueByName(index, name, Float.toString(value));
	}

	// 设置指定name对象的值
	public void setValueByName(int index, String name, int value) {
		setValueByName(index, name, Integer.toString(value));
	}

	// 设置指定name对象的值
	public void setValueByName(int index, String name, long value) {
		setValueByName(index, name, Long.toString(value));
	}

	// 设置指定name对象的值
	public void setValueByName(int index, String name, String value) {
		if (index >= 0 && !Checker.isEmpty(name) && value != null)
			script.append("$$('[name=").append(name).append("]')[").append(
					index).append("].value='").append(formatHtml(value))
					.append("';");
	}
}
